Skip to main content

Presigned URL API

Generates a presigned URL for accessing videos stored in an Amazon S3 bucket. The presigned URL allows temporary access to the video without exposing the S3 credentials.


Instance Variables

Bucket Configuration

  • Bucket Name: piglet-video-uploads

Environment Variables

  • AWS_ACCESS_KEY_ID – The AWS access key for authentication.
  • AWS_SECRET_ACCESS_KEY – The AWS secret key for authentication.

Public API Methods

GET /api/presigned-url

Generates a presigned URL for a given video ID stored in AWS S3.

Parameters

ParameterTypeRequiredDescription
idString✅ YesThe S3 Key (filename) of the requested video.

Example Usage

const res = await fetch(`/api/presigned-url?id=giant_pandas`);
const data = await res.json();
console.log(data.url); // The presigned URL to access the video

Returns

FieldTypeDescription
urlStringThe temporary presigned URL allowing access to the requested video.
errorStringError message if something goes wrong.

Example Response (Success)

{
"url": "https://s3.amazonaws.com/piglet-video-uploads/giant_pandas?AWSAccessKeyId=..."
}

Example Response (Error)

{
"error": "Missing id parameter"
}

Private Methods

generatePresignedUrl(String id)

Generates a presigned URL for a given S3 object key.

Parameters

ParameterTypeDescription
idStringThe S3 key (filename) of the requested video.

Returns

TypeDescription
StringA presigned URL granting temporary access to the S3 object.

Example Usage

const url = generatePresignedUrl("giant_pandas");
console.log(url);

Implementation

File: src/app/api/presigned-url/route.ts

import { NextResponse } from "next/server";
import { S3 } from "aws-sdk";

export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const id = searchParams.get("id");

if (!id) {
return NextResponse.json({ error: "Missing id parameter" }, { status: 400 });
}

const s3 = new S3({
region: "us-east-1",
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
});

const params = {
Bucket: "piglet-video-uploads",
Key: id,
Expires: 60, // URL expires in 60 seconds
};

try {
const url = s3.getSignedUrl("getObject", params);
return NextResponse.json({ url });
} catch (error) {
return NextResponse.json({ error: "Error generating URL" }, { status: 500 });
}
}

Error Handling

ErrorStatus CodeDescription
Missing ID Parameter400The request must include an id parameter.
AWS SDK Failure500An error occurred while generating the presigned URL.

Notes

  • The presigned URL is valid for 60 seconds.
  • Ensure AWS credentials are set up correctly in the environment variables.